perm filename GCREF.FAI[SYS,HE]1 blob sn#045184 filedate 1973-05-24 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00019 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		TITLE	GCREF - MULTI FILE CREF LISTINGS
C00005 00003	GET THE COMMAND LINE AND PUT INTO THE COMMAND BUFFER
C00009 00004	 PROCESS A SWITCH IF / IS BREAK CHARACTER
C00012 00005	 NOW WE HAVE FINISHED SCANNING COMMAND LINE
C00014 00006	 FIND CORRECT PAGE OF FILE
C00017 00007	 HAVING FOUND CORRECT PAGE, SCAN IT AND BUILD DATA STRUCTURE
C00020 00008	 KEEP ON BUILDING STRUCTURE
C00023 00009	 END OF STRUCTURE BUILDING - NOW WE OUTPUT IT
C00025 00010	 RECURSIVE OUTPUT ROUTINE
C00029 00011	 GET ONE PART OF FILE SPECS
C00031 00012	 MAGIC DECIMAL CONVERSION ROUTINE 
C00033 00013	 STRING EQUALITY TEST
C00035 00014	 CREATE A NEW IDENTIFIER BLOCK
C00037 00015	 THIS IS THE MAGIC 6-STATE, TABLE DRIVEN, INPUT PARSER
C00040 00016	 MORE BRANCHES FOR INPUT SCANNER
C00042 00017	 PRIMARY TABLE FOR INPUT SCANNER
C00044 00018	 MORE SECONDARY TABLES
C00046 00019	 FINISH WITH SOME VARIABLES
C00048 ENDMK
C⊗;
	TITLE	GCREF - MULTI FILE CREF LISTINGS
EXTERNAL JOBREL,JOBFF

P←17
PT←16;		CURRENT LINK POINTER
ST←15;		STATE
FR←14;		FREE STORAGE POINTER
CONV←13;	ARGUMENT FOR CONVRT
TA←12;		T AND TA MUST BE CONSECUTIVE
T←11
NEW←10;		POINTER TO NEW BLOCK
INP←7;		INPUT POINTER
NBUF←4;		# OF I/O BUFFERS
PLEN←40;	LENGTH OF STACK

;FIRST WE INITIALIZE THE WORLD EVERYTIME WE START A NEW COMMAND

	SKIPE SVJOB
	JRST [	MOVE SVJOB		;THIS CORE IMAGE ALREADY RAN
		MOVEM JOBFF		;RESTORE JOBFF
		JRST GCREF]
	MOVE JOBFF			;OTHERWISE,
	MOVEM SVJOB#			;SAVE JOBFF FOR INITIALIZATION
GCREF:	MOVE P,[IOWD PLEN,PDL]		;INIT STACK
	SETZM SHORT			;INIT FLAGS - SHORT LISTING
	SETZM GLBAL			;	GLOBALS ONLY
	SETZM LOCAL			;	LOCALS ONLY
	SETZM OUTPNT			;INIT POINTERS - DEFAULT OUTPUT FILE
	SETZM INPNT			;	START OF INPUT FILES
	HRRZ FR,JOBFF			;	START OF FREE STORAGE-1
	SETZM STRUCT			;	START OF DATA STRUCTURE
	SETZM DEFPPN
	HRLZI 'CRF'
	MOVEM DEFEXT
	SETZM ERROR			; ERROR FLAG
	MOVE 1,JOBREL			; START WITH 1K OF FREE CORE
	ADDI 1,2000
	CALLI 1,11
	JRST NOCORE
	INIT 1,				; OPEN DISK
	SIXBIT .DSK.
	XWD OBUF,IBUF
	JRST [ OUTSTR [ASCIZ . NO DISK.]
	       CALLI 12]
	OUTSTR CRLF
	OUTCHR ["*"]			;TELL HIM WE ARE READY
;GET THE COMMAND LINE AND PUT INTO THE COMMAND BUFFER

COMGET:	MOVE 1,COMPNT			; READ LINE INTO COMMAND BUFFER
	INCHWL 2
	IDPB 2,1
	CAIE 2,15			; UNTIL CARRIAGE RETURN
	JRST .-3
	SETZM 2				;CONVERT TO ASCIZ
	IDPB 2,1
	CLRBFI				;FLUSH LINE FEED FROM BUFFER

; SCAN COMMAND LINE FOR FILE NAME OR SWITCH
	
	MOVE 1,COMPNT
	SETZM 4
GETFIL:	SETZM NAME
	MOVE 2,[POINT 7,NAME]		;  GET NEXT FILE SPECS
	PUSHJ P,GETPAR			;	LOOK FOR FILE NAME
	SKIPN SNAM
	JRST SPCERR
	PUSH FR,SNAM
	MOVEI PT,(FR)
	CAIE 4,"."
	JRST [PUSH FR,DEFEXT		;	NO EXTENSION GIVEN
	      JRST ENDEXT]
	IDPB 4,2
	PUSHJ P,GETPAR			;   	LOOK FOR EXTENSION
	PUSH FR,SNAM
	MOVE SNAM
	TRNE 777777
	JRST SPCERR			;	EXTENSION TOO LONG
	MOVEM DEFEXT			;	NEW DEFAULT
ENDEXT:	PUSH FR,[0]			;	THIS IS A LOOKUP BLOCK
	CAIE 4,"["
	JRST [PUSH FR,DEFPPN		;	NO PPN GIVEN
	      JRST ENDPPN]
	IDPB 4,2
	PUSHJ P,GETPAR			;	GET PPN
	SKIPN 6,SNAM
	JRST SPCERR
	TLNN 6,77			;	RIGHT ADJUSTED
	JRST [LSH 6,-6
	      JRST .-1]
	PUSH FR,6
	HLLM 6,DEFPPN
	CAIE 4,","
	JRST SPCERR
	IDPB 4,2
	PUSHJ P,GETPAR			;	GET REST OF PPN
	SKIPN 6,SNAM
	JRST SPCERR
	TLNN 6,77			;	ALSO RIGHT ADJUSTED
	JRST [LSH 6,-6
	      JRST .-1]
	HLRM 6,(FR)
	HLRM 6,DEFPPN
	IDPB 4,2
	CAIN 4,"]"
	JRST [	ILDB 4,1		; GET NEXT BREAK CHARACTER
		JRST ENDPPN]
SPCERR:	OUTSTR CRLF
	OUTSTR [ASCIZ .ILLEGAL FILE SPECIFICATION .]
	OUTSTR NAME
IGLOUT:	OUTSTR CRLF
	JRST GCLOOP
; PROCESS A SWITCH IF / IS BREAK CHARACTER

ENDPPN:	CAIE 4,"/"			; SWITCH COMING UP
	JRST L2
	ILDB 4,1
	CAIN 4,"L"
	JRST [SETOM LOCAL		; OUTPUT ONLY LOCALS
	      JRST LAB1]
	CAIN 4,"S"
	JRST [SETOM SHORT		; SHORT LISTING REQUESTED
	      JRST LAB1]
	CAIN 4,"G"
	JRST [SETOM GLBAL		; OUTPUT ONLY GLOBALS
LAB1:	      ILDB 4,1			;GET A NEW BREAK CHAR TO DECODE
	      JRST ENDPPN]
	OUTSTR CRLF
	OUTSTR [ASCIZ .ILLEGAL SWITCH - .]
IGLCHR:	OUTCHR 4
	JRST IGLOUT

; STORE FILE NAME FOR INPUT OR OUTPUT, AS BREAK CHAR INDICATES

L2:	CAIE 4,"←"
	JRST L1
	SKIPN INPNT			;OUTPUT FILE - ERROR IF INPUT FILE
	SKIPE OUTPNT			; ALREADY EXISTS OR
	JRST IGLBRK			; ALREADY HAVE AN OUTPUT FILE
	MOVEM PT,OUTPNT			; OTHERWISE, STORE POINTER TO BLOCK
	JRST GETFIL

; WE HAVE ANOTHER INPUT FILE TO STORE IN LIST

L1:	SKIPN INPNT			; INIT POINTER IF FIRST BLOCK
	MOVEM PT,INPNT			; NEW INPUT FILE SPEC FOUND
	PUSHJ P,LOOKFL			; MAKE SURE FILE EXISTS
	CLOSE 1,			; BUT THEN LET GO OF IT FOR NOW
	CAIN 4,","
	JRST GETFIL			; RETURN FOR NEXT FILE SPEC
	CAIN 4,"→"
	JRST	[OUTSTR CRLF
		OUTCHR ["→"]
		JRST COMGET]		; MULTI LINE COMMAND
	CAIN 4,15
	JRST ENDCOM			; END OF COMMAND SCANNING
IGLBRK:	OUTSTR CRLF
	OUTSTR [ASCIZ .ILLEGAL CHARACTER - .]
	JRST IGLCHR
; NOW WE HAVE FINISHED SCANNING COMMAND LINE
; LOOKUP EACH FILE 

ENDCOM:	PUSH FR,[0]			; TO STOP FILE LOOKUPS
	SKIPE INPNT
	SKIPE ERROR
	JRST COMGET			; NO INPUT FILES OR ERROR
	MOVE INPNT
	MOVEM NXTPNT#			; NEXT INPUT FILE
	MOVEI 1,(FR)			; SET UP IOWD FOR FREE POINTER
	SUB FR,JOBREL
	HRLI FR,(FR)
	HRRI FR,(1)
LOOP:	MOVE 1,NXTPNT			;START LOOP TO INPUT FILES
	SKIPN 2,(1)			; IF ZERO - END OF FILES
	JRST ENDFIL
	LOOKUP 1,(1)			; LOOKUP NEXT FILE
	HALT				; ALREADY CHECKED THIS
	MOVEI 4(1)			; UPDATE POINTER TO NEXT FILE
	MOVEM NXTPNT
	MOVEI BUFRS			; GET SOME BUFFERS
	MOVEM JOBFF
	INBUF 1,NBUF
	INPUT 1,			; AND SOME DATA
	MOVE 3,[POINT 7,NAME+1]		; CONVERT FILE NAME TO ASCIZ
	SETZM NAME
	SETZM 1
	LSHC 1,6
	JUMPE 1,.+5
	MOVEI 1,40(1)
	IDPB 1,3
	AOS NAME
	JRST .-6
	IDPB 1,3
	OUTSTR CRLF			; LET USER KNOW WE ARE WORKING
	OUTSTR NAME+1
P11:	MOVEI 1,=30*5			; GET FIRST LINE OF PAGE
	MOVE 2,COMPNT
P10:	PUSHJ P,GCHAR
	IDPB CONV,2
	CAIN CONV,12
	JRST P2
	CAIN CONV,14
	JRST P11
	SOJG 1,P10
	JRST TSTFAL			; LINE TOO LONG
P2:	SETZM ST			;SCAN LINE AND TEST IF RIGHT PAGE
	MOVE [ILDB CONV,INP]		; SET PARSER TO READ CURRENT LINE
	MOVEM GET
	SETZM SVBRK
	MOVE INP,COMPNT
	SETZM CCNT
; FIND CORRECT PAGE OF FILE

P1:	SETZM ID
	PUSHJ P,PARSE			; PARSE INPUT
	MOVE 1,ID			; GET COUNT
	MOVE 2,ID+1			; AND FIRST WORD OF IDENTIFIER
	CAIN 1,4
	JRST	[XOR 2,[ASCII .FAIL.]	; COUNT=4
		ANDCMI 2,17		; TEST FAILS IF ID='FAIL' OR 'SAIL'
		JUMPE 2,TSTFAL
		MOVE 2,ID+1
		XOR 2,[ASCII .SAIL.]
		ANDCMI 2,17
		JUMPE 2,TSTFAL
		JRST P1]
	CAIN 1,5
	JRST	[XOR 2,[ASCII .MACRO.]	; COUNT=5
		JUMPE 2,TSTFAL		; TEST FAILS IF ID='MACRO'
		JRST P1]
	CAIE 1,7
	JRST P1				; NOT A RECOGNIZED ID, SCAN FURTHER
	XOR 2,[ASCII .PROGR.]		; COUNT=7
	JUMPN 2,P1			; TEST FAILS IF ID='PROGRAM'
	MOVE 2,ID+2
	XOR 2,[ASCII .AM.]
	AND 2,[XWD 17,-1]
	JUMPN 2,P1
TSTFAL:	MOVEI ST,1			;NOT CORRECT PAGE
	MOVE P10
	MOVEM GET
	SETZM SVBRK
	PUSHJ P,PARSE			;SCAN TO NEXT PAGE
	JRST P11			; AND TEST IT

; DATA STRUCTURE IS AS FOLLOWS:
;	WORD 1	LH: POINTER TO LAST BLOCK - 0 IF FIRST BLOCK OF LIST
;		RH: POINTER TO NEXT BLOCK - 0 IF LAST BLOCK OF LIST
;	WORD 2	LH: POINTER TO FIRST BLOCK ON LOWER STRUCTURE (0 IF LOWEST
;			LEVEL)
;		RH: WORD COUNT FOR DATA
;	REST	DATA: IF IDENTIFIER, CHARACTER COUNT FOLLOWED BY ASCIZ
;			STRING; IF LINE NUMBERS, DIGITS
;			STORED TWO TO A WORD (0 IN UNUSED HALVES) AND
;			NEGATED IF THIS IS THE IDENTIFIER DEFINITION
;
;	TOP LEVEL ARE IDENTIFIERS USED IN PROGRAM
;	NEXT LEVEL, FOR EACH IDENTIFIER, IS THE NAMES OF THE FILES
;		CONTAINING THE IDENTIFIER
;	NEXT LEVEL, IF ANY, IS THE NAMES OF THE BLOCKS WITHIN WHICH THE
;		IDENTIFIER WAS DEFINED
;	BOTTOM LEVEL IS LIST OF LINE NUMBERS
; HAVING FOUND CORRECT PAGE, SCAN IT AND BUILD DATA STRUCTURE

TSTOK:	MOVE [ILDB CONV,INP]		;NOW WE HAVE THE CORRECT PAGE
	MOVEM GET			; SCAN FIRST LINE AGAIN
	MOVE INP,COMPNT
	SETZM LEV1			; NO ID ON LEVEL 1 YET
	PUSH P,[STRUCT]			; INIT LINK POINTER
	PUSHJ P,IDPARS			; GET AN IDENTIFIER
LLEV1:	MOVEI T,ID
	MOVEI TA,LEV1
	PUSHJ P,EQUAL			; TEST FOR EQUALITY
	JRST [	SKIPN LEV1
		JRST LEV1A		;   ID<LEV1 - ADD ID BEFORE BLOCK
		JRST ENDXRF]		;		OR END OF XREF
	JRST [	MOVE 4,LKSM
		JRST EQUL1]		;   ID=LEV1 - STILL ON SAME ID
	POP P,PT			;   ID>LEV1 - NEW ID GET LEVEL 1 PTR
LEV1C:	HRRZ 6,(PT)
	JUMPE 6,LEV1A			; END OF LIST - ADD NEW IDENTIFIER
	MOVEI TA,2(6)			; GET POINTER TO NEXT IDENTIFIER
	PUSHJ P,EQUAL
	JRST LEV1A			; ADD NEW ID BEFORE THIS BLOCK
	JRST [	HRRZ PT,(PT)
		JRST LEV1B]		; IDENTIFIER FOUND IN LIST
	HRRZ PT,(PT)
	JRST LEV1C			; CHECK NEXT ELEMENT OF LIST

LEV1B:	PUSH P,PT			; IDENTIFIER FOUND, SAVE LEVEL 1 PTR
	HLRZ PT,1(PT)			; GO DOWN ONE LEVEL
	HRRZ 6,(PT)			; AND FIND END OF LIST OF FILES
	JUMPE 6,LEV2A
	MOVEI PT,(6)
	JRST .-3

LEV2A:	MOVE 4,LKSM			; AND BRANCH TO LINK FILE BLOCK
	JRST LEV2B			; AT SAME LEVEL

LEV1A:	PUSHJ P,CREBLK			; CREATE A NEW BLOCK - ID PNTR IN T
	PUSH P,NEW			; SAVE NEW LEVEL 1 POINTER
	MOVE 1,(PT)			; LINK NEW BLOCK AT SAME LEVEL
LKSM:	HRRM NEW,(PT)
	HRLM PT,(NEW)
	HRRM 1,(NEW)
	HRLM NEW,(1)
	MOVEI PT,(NEW)
	MOVE 4,[HRLM NEW,1(PT)]		; LINK FILE BLOCK AT NEXT LEVEL
LEV2B:	MOVEI T,NAME			; CREATE BLOCK FOR FILE NAME
	PUSHJ P,CREBLK
	XCT 4				; LINK AT  LEVEL 2
	MOVEI PT,(NEW)
	MOVE 1,[XWD ID,LEV1]		; SAVE CURRENT LEVEL 1 IDENTIFIER
	BLT 1,LEV1+7
; KEEP ON BUILDING STRUCTURE

	CAIG CONV,"9"			; IS NEXT ELEMENT A NUMBER?
	CAIGE CONV,"0"
	JRST LEV3A			; NO 
	MOVEI 1,1(FR)			; YES - SAVE CURRENT LEVEL 3 POINTER
	PUSH P,1			; SAVE TO-BE-CREATED LEVEL 3 PNTR
	JRST NUL

LEV3A:	MOVE 4,[HRLM NEW,1(PT)]		; LINK BLOCK AT NEXT LEVEL
EQUL1:	PUSHJ P,IDPARS			; GET BLOCK NAME
	MOVEI T,ID
	PUSHJ P,CREBLK			; CREATE A BLOCK FOR IT
	XCT 4				; AND LINK IT AT LEVEL 3
	MOVEI PT,(NEW)
	PUSH P,PT			; SAVE CURRENT LEVEL 3 POINTER
NUL:	AOBJN FR,.+2			; CREATE A BLOCK FOR THE LINE NUMBERS
	PUSHJ P,GETCOR
	HRLM FR,1(PT)			; AND LINK AT NEXT LEVEL (3 OR 4)
	SETZM (FR)
	AOBJN FR,.+2
	PUSHJ P,GETCOR
	HRRZI PT,(FR)
	SETZM (PT)
	SETZM T
C2:	PUSHJ P,IDPARS			; GET NEXT NUMBER
	SKIPE ID
	JRST ENDLEV 			; IDENTIFIER 
	MOVE TA,NUMB
	CAIL TA,77777
	JRST ENDXRF			; FUNNY NUMBER - EOF 
	CAIN CONV,"#"
	MOVNS TA			; NEGATE LINE NUMBER IF DEFINITION
	JUMPN T,.+4
	AOBJN FR,.+2
	PUSHJ P,GETCOR
	AOS (PT)			; INCREMENT WORD COUNT
	XCT CTAB(T)
	TRC T,1
	JRST C2

CTAB:	HRLZM TA,(FR)
	HRRM TA,(FR)

ENDLEV:	POP P,PT			; RESTORE LEVEL THREE POINTER
	JRST LLEV1			; RETURN TO START NEXT LINE

ENDXRF:	MOVE P,[IOWD PLEN,PDL]		;FLUSH ENTIRE STACK
	JRST LOOP			;RETURN FOR NEXT FILE
; END OF STRUCTURE BUILDING - NOW WE OUTPUT IT

N←15;	FIELD WIDTH
M←14;	FIELD START
CNT←10;	LINE CHAR COUNT
LCT←7;	LINE NUMBER COUNT
LEN←6;	MAXIMUM LINE LENGTH

ENDFIL:	CLOSE 1,			;RELEASE LAST INPUT FILE
	SKIPN 1,OUTPNT
	MOVEI 1,DEFOUT
	ENTER 1,(1)			;CREATE OUTPUT FILE
	JRST [	OUTSTR CRLF
		OUTSTR [ASCIZ .COULD NOT ENTER OUTPUT FILE.]
		CALLI 12]
	MOVEI BUFRS
	MOVEM JOBFF
	OUTBUF 1,NBUF
	SKIPN PT,STRUCT
	JRST DONE
	MOVEI LEN,=120
	SKIPE SHORT
	MOVEI LEN,=70			;MAXIMUM LINE LENGTH
	SETZM M				; INIT FIELD START
	MOVEI N,=10			; AND FIELD WIDTH
	MOVE [PUSHJ P,GLBCHK]		;INIT GLOBAL TEST
	SKIPN GLBAL
	MOVE [SKIPA]			; IF REQUESTED
	SKIPE LOCAL
	MOVE [PUSHJ P,LOCCHK]		; INIT LOCAL TEST
	MOVEM TEST#
	SETZM CNT			; INIT CHARACTER COUNT
	PUSHJ P,OUTLPT			;CALL OUTPUT ROUTINE
DONE:	RELEASE 1,			;END OF LISTING
GCLOOP:	MOVE 1,SVJOB			;SET CORE BACK TO INITIAL VALUE
	MOVEM 1,JOBFF
	CALLI 1,11
	HALT
	JRST GCREF
; RECURSIVE OUTPUT ROUTINE
; EACH CALL OUTPUTS A LIST AT ONE LEVEL

OUTLPT:	XCT TEST		; DO SELECTION TEST
	JRST NXTBLK		; FAILED - GET NEXT BLOCK
	MOVEI CONV," "		;FILL IN BLANKS TO COLUMN M
	CAIL CNT,(M)		;OTHERWISE THIS IS AN ID BLOCK
	JRST OL1
	PUSHJ P,PCHAR
	JRST .-3

OL1:	HLRZ 5,1(PT)		;GET POINTER TO NEXT LOWER LEVEL
	JUMPE 5,LINOUT		;NONE- THIS IS A LINE NUMBER BLOCK
	MOVEI T,2(PT)		;POINTER TO IDENTIFIER NAME
	MOVEI TA,-1(N)		;LEAVE AT LEAST ONE BLANK AFTER NAME
	PUSHJ P,OUTID		;PUT IT IN THE LINE
	PUSH P,TEST		;STACK PARAMATERS FOR RECURSION
	PUSH P,M
	PUSH P,N
	PUSH P,PT
	MOVE [SKIPA]
	MOVEM TEST
	ADDI M,(N)		;SET UP FOR NEXT LEVEL
	MOVEI N,=8
	MOVEI PT,(5)
	PUSHJ P,OUTLPT		;AND CALL AGAIN FOR NEXT LEVEL
	POP P,PT		;ALL LOWER LEVELS DONE, RESTORE
	POP P,N
	POP P,M
	POP P,TEST
NXTBLK:	HRRZ PT,(PT)		;GET NEXT BLOCK ON THIS LEVEL
	JUMPN PT,OUTLPT		;AND RETURN TO PROCESS
	POPJ P,			;IF ZERO, WE ARE DONE AT THIS LEVEL

LINOUT:	HRRZ LCT,1(PT)		;THIS IS A LINE NUMBER BLOCK-GET WORD COUNT
	PUSH P,PT		;SAVE POINTER
	MOVEI PT,1(PT)		;POINT AT FIRST WORD-1 OF LINE NUMBER
	SETZM 3			;INIT HALF WORD
OL3:	JUMPN 3,.+3
	AOS PT			;INDEX TO NEXT WORD IF READY FOR LEFT HALF
	SOJL LCT,OL4		;DONE
	XCT LOAD(3)		;LOAD PROPER HALF WORD
	TRC 3,1			;SWITCH HALVES
	JUMPE 4,OL4		;IF ZERO, DONE
	MOVEI 1,(CNT)		;COMPUTE CHAR COUNT AT END OF OUTPUT
	ADDI 1,(N)
	CAIG 1,(LEN)
	JRST OL2
	MOVEI CONV,15		;OUTPUT CRLF
	PUSHJ P,PCHAR
	MOVEI CONV,12
	PUSHJ P,PCHAR
	SETZM CNT		;CLEAR LINE COUNT
	MOVEI CONV," "		;AND SPACE TO PROPER COLUMN
	CAIL CNT,(M)
	JRST OL2
	PUSHJ P,PCHAR
	JRST .-3

LOAD:	HLRE 4,(PT)
	HRRE 4,(PT)

OL2:	MOVE CONV,4
	PUSHJ P,CONVRT		;OUTPUT LINE NUMBER
	JRST OL3		;RETURN FOR NEXT LINE NUMBER

OL4:	POP P,PT		;RESTORE POINTER
	MOVEI CONV,15		;END OF LINE NUMBER - OUTPUT CRLF
	PUSHJ P,PCHAR
	MOVEI CONV,12
	PUSHJ P,PCHAR
	SETZM CNT
	JRST NXTBLK		;RETURN FOR NEXT BLOCK ON THIS LEVEL

;IDENTIFIER OUTPUT ROUTINE
;POINTER TO COUNT IN T
;MAXIMUM COUNT IN TA
;OUTPUTS MINIMUM OF TWO COUNTS TO LPT
;USES AC 1

OUTID:	CAML TA,(T)
	MOVE TA,(T)		;GET SMALLER COUNT
	MOVE 1,[POINT 7,0]	;SET UP BYTE POINTER
	HRRI 1,1(T)
	ILDB CONV,1
	PUSHJ P,PCHAR
	SOJG TA,.-2
	POPJ P,
; GET ONE PART OF FILE SPECS
; SIXBIT PUT INTO SNAM
; ASCII ADDED TO NAME THROUGH POINTER IN 2
; EXPECT POINTER TO INPUT BUFFER IN 1
; LEAVES BREAK CHARACTER IN 4
; SKIPS BLANKS

GETPAR:	MOVE 3,[POINT 6,SNAM]
	SETZM SNAM
GETCHR:	ILDB 4,1
	CAIN 4," "
	JRST GETCHR
	CAIL 4,"0"
	CAILE 4,"9"
	SKIPA
	JRST .+4
	CAIL 4,"A"
	CAILE 4,"Z"
	POPJ P,
	IDPB 4,2
	MOVEI 4,-40(4)
	IDPB 4,3
	JRST GETCHR

;GET ONE CHARACTER FROM INPUT BUFFER
;RETURN IT IN CONV
;BRANCH TO EOF IF END OF FILE ON DISK SEEN

GCHAR:	SOSG IBUF+2
	IN 1,
	SKIPA
	JRST DSKERR
	ILDB CONV,IBUF+1
	POPJ P,

;PUT ONE CHARACTER IN OUTPUT BUFFER
;IT IS IN CONV

PCHAR:	SOSG OBUF+2
	OUT 1,
	SKIPA
	JRST DERR
	IDPB CONV,OBUF+1
	AOS CNT				;INDEX CHAR COUNT
	POPJ P,

DSKERR:	STATZ 1,20000
	JRST [	SETZM CONV		;EOF-RETURN ZERO CHAR
		POPJ P,]
DERR:	OUTSTR CRLF
	OUTSTR [ASCIZ .DISK ERROR.]
	CALLI 12
; MAGIC DECIMAL CONVERSION ROUTINE 
; N DIGIT OUTPUT WITH LEAD ZEROS SUPPRESSED
; # AFTER NUMBER IF IT WAS NEGATIVE
; NUMBER IN CONV ON ENTRY
; WILL NOT PRINT ZERO !!
; USES AC T AND TA AND 1


CONVRT:	MOVM T,CONV
	SKIPGE CONV
	JRST	[PUSH P,["#"]
		JRST .+2]
	PUSH P,[" "]
	MOVEI 1,-1(N)		;FINAL CHAR COUNTS TOO
	SETZM SUP#
	PUSHJ P,CONV1
	POP P,CONV
	PUSHJ P,PCHAR
	POPJ P,

CONV1:	JUMPE T,[MOVEI CONV," "	;RECURSIVE DECIMAL OUTPUT ROUTINE
		PUSHJ P,PCHAR	;SUPPRESS LEAD ZEROS
		SOJG 1,$.-1
		POPJ P,]
	IDIVI T,=10
	MOVEI TA,60(TA)		;CONVERT DIGIT TO STRING
CONV2:	HRLM TA,(P)		;STACK CHARACTER FOR OUTPUT
	SOJLE 1,.+2
	PUSHJ P,CONV1
	HLRZ CONV,(P)
	JRST PCHAR

; CORE GETTING ROUTINE AND ERROR OUTPUT
; UPDATES FR
; USES AC 1

GETCOR:	MOVE 1,JOBREL
	ADDI 1,2000
	CALLI 1,11
	JRST NOCORE
	HRLI FR,-2000
	POPJ P,

NOCORE:	OUTSTR CRLF
	OUTSTR [ASCIZ .NO FREE CORE.]
	CALLI 12
; STRING EQUALITY TEST
; FIRST STRING POINTER IN[
B¬∧→~"∧|dλ4D
*1PPL**5"∧z(T
 ⊃↔4≤|Zλ∃∀*λz$,
HZ"αj
Ge$λQ!PT+↔!∃≤⎇4ε0HH↔8Tt"	xb¬≥J)∀t:ε∀αj∧→I∀<r
:E∀Lhtβ⊂h(V#PL8→T<*ε∃C_H↔8Tt"	xb¬≥J)∀t:ε$αjβ∀λ∀e∀X_EJ∧→I∀<tXAPPM	z∧R¬¬A⊂HK::E∀Lhtβ
¬9	u∃$Z:@hP_8∀l*ε∃C_h(z$,
G!∀⎇4¬¬αH⊃⊃∪]≥J)∀t:ε$¬≤Dz*D-≥AQ Lz4αEα⊃⊃⊂K]:J$Ltz4∧|2λZ∃,D	D,tzIhP~	u∧R
¬@hPQ'5$-:D∧4⎇$λtd|(→BαDz$∧d|8→BJ∧_HTu$_i∀-∩¬	tr∧HZd,bε∀∧|tK∃⊂hS:94M¬4	∀2∧yIt∀D¬∧⎇∩	It≤E⊃PS]Z8U~∧_4βλh!Q$<d(9∧[P→	E∃Rε∃C
E
E⊂HK8xU"∧I~5"∧xd∧4LHT∧tXZ0hP→
%∃Rε∃BC
⊃Q M≤9~∧*β⊃Q Lz4αEα⊃⊃⊂KZλyD|∀→D∧L2	Yu∀*
I∧r	yd(h!~∧⎇∧$
α`h!Q$d|89∧[P→	E∃Rε∃C
E
E⊂HK8xU"∧I~5"∧xd∧4LHT∧tXZ0hP→
%∃Rε∃BC
⊃Q M≤9~∧rβ⊃Q Lz4αEα⊃⊃⊂KZ	It≤D	∀2∧yiEJ∧yhPhP~	u∧R
¬@hPcZλ:$,
HT∧
∧hZr∧LHYe$Li_U∩∧)It≤XQ'2¬∧y→e$-$
Dz∧_HTu$_i∀-∩	→b¬"D
tDL9∧∧M~λHU≥%){∀, Q'2∧dX~d-~
	tLuHZ"¬$tλ$d|94∧Lr	hU8h'4¬-≤Z4∧~ε∃S_h!Q$≥∀X)D[P_→t∀Tdλe∩be6 HH↔8t-"λi∃∃≥D
t⎇∀AQ M¬Z9∧R¬¬Ht-$9z hP→Yu4,∀	d-:Eλe∩H⊃⊃∪]≤~hR¬∧y→e$-!Q M≤ZK$jα	hU:H⊃⊃∪\≤HX∃∩∧)It≤Z
	tLuHZ%_h!_∀|∀)d∧5∩Ee3⊂H⊃↔4<-D
4,≤yhB¬<z(@hP~
U≤D$
αd<ZH4⎇⊂Q!∀l⎇hTβ∩b
E⊂HH↔8t-"λ9∧
∀_:D-∩λ9u,uAQ LHI∩β∩FQ⊂HK8iu∩∧9zTu"
yu∀ Q!∀L$~i∩β∩FQPPM99∃∧*ε1PPL_HDJβ%F⊂HH↔:t⎇∀Dλ4⎇,jD∧4⎇$	∀$,jI∀4LZ!PPLYzd,jε%BD5%⊃PPL→x$Trλj"br6!⊂HK::D⎇∀Tλ4D
$λ4⎇,jD∧tD	∀ h!~¬-≤	$¬αdxZD≤⎇!Q LlzhRβ~E
BHh!→T⎇4YTβ~bλj"Hh!_∀⎇~
APPM9y$:β%Ebk(Q!∃∧⎇	$¬α`Q!PSZ
HU≥"λi∀d*
:∧,≤_i∀,"
Ir∧l→8R¬≥Z(R∧MDλUDM:J0hPQ)D||8iCPL
)DJβ5ES~Dj%⊂hP→
%∀Jε5Dd∀I1PPL)JBβ~IH$dZ61PPLIyt]-∧ε∩dd)I0hP→*%≥ ≠:4-$yT∧-∃)z HK4λdLdTλD|-4	d⎇"λ[∧M≥D¬R¬≤ZD∧4d_qPPH→zU%≥J$∧≥∀HaPPH→zU%≥J$¬\
89∃Rαiir¬≥X9α∧4→HRαj¬kPhP⊃~4-%)Tβ0H⊃↔2∧hD¬$,ID∧DLT	d⎇:
(∃$DZ$¬$D→aPPH→_E∧∩εeC⊂H↔4∧5HZ"¬$Yd∧lLjZD-~	xb¬¬)x4-≥9→d8h!⊃∀⎇-J:E∩∧h→T(H↔4¬$DT
¬∀-i→u-~λi∀d-1Q HM	z∧R¬¬KPhP~	u∧R
¬@hPQ)D∀d7!∀∀dx92β Q cZ
I∧M~	~2¬$λT∧ly_2β2Z:D
$UD¬$)HR∧%)~d,rD	∀u¬ZD¬∧
*8U⊂h'4¬≥$~HR∧M4	∀r¬:APSZ	zU%¬ZD∧M~	→b∧LED∧L2	_D,uI_dL-%D∧u,X$∧L2	jTl∀Z!PSZ
(U%-)j2¬<~Iα∧≤yjb∧≤yjDLi→d:∧*(TZλ9∧
∩Dεα∧Ld	∀$,jEb¬<~4¬$|t	D|tqQ#Z∧_d∧L"	~2¬TZ)rb¬(ZE-∀i→d:∧jYT∀-'4∧⎇$λZ%<M8UB∧LD	∃~∧9zTu"
y∃$B	_D,uEaPSZ∧∧¬≥$~*DLtt	∀r∧_E3λh'4¬-≤Z4∧~ε⊃PPh)_E∧
*7 LlzhTJ¬:EC⊂H⊃↔4Lt~D¬$z
λ∃∃≤T	∀$,jI∀4LZ*0hUλ~%≤+!~4\M	d∧≤|jeE≥4*)2_H↔4¬-≤Tλ%∀,→4∧≤D~$∧L2
8∃4,AQ$<-G!∀DJA⊂HH↔4∧≤II∀t:

$|=(→R∧Li~E~∧→j¬- Q!∃≤-K)R¬≥h*$XH⊃↔2∧∃(X∀Z∧(_B∧DZ(PhP_→d$Jλ9tu2F⊗s8H⊃↔2∧$~:∧
$9∧∧|rλ9∧
∀_:D-⊂Q!∀U∃:D∧αD9ye2MH_ hPQ'2∧∃(→d≤DZ4∧5∀yT∧Lu
ZB¬≤8→dt-$
D∀HQPPh(h∀LeJ7 M∧z∧¬αb
¬⊂HK8iE-≤∧
$-%Z)`hP→Yu4*
ε∪H↔:4-"	→e¬-D
Dz¬(X∀"∧j)tj∧I~4Xh!→T⎇4YT∧<-AQ LU*:B¬%:Hd`⊃↔4tDλdLD
D-≥AQ hTyyt%%7!∃∧⎇∧
αbE¬⊃⊂K\iJU≤B
(U%-)aPPLYzd*¬;
t"∧Hh∃$∩JF2[∃Q↔5≤-Dλ4|$T
Dz¬:y∃$≤∧	∀u¬ZD∧
"	hUE"	H`hP_)E"¬F53(h!~4-%)T¬≥4*)0hP→*%≥"
J5$|1⊃∪\hD¬∧
:4¬$-:APPh(h∀Lc'!∃∧⎇∧
αbE¬⊃⊂K\iJU≤B
(U%-)aPPL**5"¬ε!⊂HK:xR∧
(T∧
"	hUE"
λ∀<(Q!PT∃)8∪PM99∃∧rλ84u ⊃↔4u,ID∧dLhT∧LdHXtbλ~2∧4~*5"∧I→d(h!→%∃≥DλdLJJ0hT*)3PL→z2∧≤9j@HK9→d$-∧λ4D
(_5$-$λ4⎇,jAPPM99∃∧b	_@hP→*%≥"λxU H↔:$-%Z)b∧|iK∩∧Ld	∀$,jI∀4LZ$∧4⎇Yh@hP→Yu4,∀πSα&U3λH↔84|m
ZD*∧9λ∃∩∧9zTu Q!∀$IT∧L Q*∧⎇∧H_#PM	z∧R¬¬A⊂HK8→E≤z
Z4,"λiu∩∧→YT,$_~D*¬(ZE-∀j1PPh*
$|≠!~4\M	d∧L ⊃↔5¬∀x8U≥~	_D,uI_dL-$	∀r¬HZ5"∧YxD(h!→%∃≥D5≤\~λR∧≤9j@hP∀∧ααα∧	%∃≥DλdLJJ0KZ	_D,uI_dL-$
4D⎇YHB¬≥H~%"∧~D∧4M*:B∧≤λ~ hP∀∧ααα∧	T⎇4i∀βk¬&R[λ↔4α¬≥H~%"∧xd∧L"	_b∧ttλ4⎇,jAPPJ∧∧ααα	Yu4,T	∀ H↔4αα¬:Iu∀*¬T∧l
∧λ4⎇,jD¬$z
:D⎇α	It⎇Q!∩αα∧∧α∧lzhRβ
K:∧|LjDβ:d_E3
hQ!∩αα∧∧α∧U*:Bαr6≠PhP_→u≤b	_@HH↔9∀t≥(YT,uDλ4⎇,jAPPL**5"∧*)0HK:(U%-)d∧L2	_D,uEd¬$|t	D|tqQ LLJλ"∧≤yjbcλ⊃↔5≥$z(R∧t[
B∧≤λ~ hP→*%≥"λxU h cZ	Yu∀*λ*$t9λU~∧iz"∧Lj
U"¬88∀ttZ!PPh((∀$≤
' L⎇ZJ5%∩λ:$d0⊃↔4LdHXtbλ9∧
∀_:D-∩λiu,tAQ L⎇ZJ5%∩8∃≤≤≠$αtLIHT<Dλ4D
(_5$-'%ehh!→u-$9
"∧≤yj`hP→zU%≥J$¬\
89∃Rαdλd⎇,hD∧Lrλi∀d*¬kPhP→zU%≥J$∧tXU3λh!→%∃≥DλTt%
(`HK::D
∃D	d-EDλdLdQQ hU:H%∀[!→T⎇4Y∀¬≥"FQ⊂K]:H∃∃"λ*$,4
4≤aQ LU*:B∧<ZAPPh(*$]≤~g LlzhTj∧9ye2e:h%∀X↔8%∀,→5B¬≤~hRb∧→hB¬∀ZJU∀pQ(%∀](ZCPM99∃∧b	_@hP~	u∧R
¬@hP→Yu4,∀πSα&U3λH↔8%∀,→4∧tD
$-%Z)`hP__D$j	_@HH↔8dMEZ∧∧L"λ9u,uD	∀2∧_HTu$_i∀-⊂Q!∃∧⎇	$¬α`Q!PU≥IjTkP~8U%TT	∀ H↔:5$
*D¬¬∀x8U≥≤→hr∧uYX$-⊂Q!∀l⎇hY∩¬≥EF@hP~:T∀Jλ9tu2FfhP→Yu4,Tλ4|ueIe,l!Q LU*:B∧<ZAPPh(_D$uYW LlzhRβ
IjTl⊂⊃↔4$D
Dz∧jYT∀-!Q LLZYDJβ∃GSQ!∃≥,)∀∧≤|jeC3Q!∀$I∀β
bλ9tu2⊃Q LlzhTjβ∃Ie,l!Q LU*:B∧<ZAPPh*:DL#!→T⎇4i∀βk¬&R[λ⊃↔5≥$~*B∧LHYe$Li_U∩¬
)t≤-:9∀t8Q!∀l⎇hYR∧LAQ LlzhRβ
K:∧|LjDβ:d_E3
hQ!∀l⎇hY∩¬≥EF0hT_HDL#!_∀⎇≤D	∀ H⊃↔4$D
Dz∧_HTu$_i∀-⊂Q!∀U∃:D¬]≤ZK$j∧9ye0K9_B∧⎇hZ$4dzxT h!∀ααα∧∧∧U∃:D∧∃∀;QPPL_J∧∩∧9ye2c⊃Q LU*:B∧<ZAPPh*8U$<ZG LlzhR¬β⊗↓⊂K\i≠¬-α	→e¬-Dλ∀t"	I∀t*λhT,"λI∃≥∧~H4@h!→T⎇4YT∧<-AQ M≤ZK$j¬:h%∀XQ!∀l⎇hT¬]ExD∧d5H_"e#56%hh!_$e"
F2[(Q!∀U∃:D∧¬#5
5"HQ!PUT9λ∃∪P_8∀LdT
5"c!⊃∪]TZ)r∧≤λ~$≥HZ"∧4zYd"αTλDM≤4λT|0Q!∀⎇-J:E∩¬8~4≤M$¬dt⎇Dλ∩∧≥(Xb∧4→HRα
∀∃ehh!→%∃≥DλTt%
(`hPcZ

$Ll~+∩¬$_)D*∧iz"∧Lj
U"¬88∀ttZ!PPh*H∀∪P~:B[∪¬EE#0⊃⊃∪\uYIB∧≤λ~ hP~(U∧,~DβkBO:5"[&¬Be#∨aPPM:E3∪αEJC⊂H⊃↔5$!Q M≥E6#αbJF0HH↔9DLtTλd,,AQ"M:E3∪αEJCλh!~5"[&¬Be#A⊃⊂K\iz$j∧hXT h!~5"[&¬Be#Q⊃⊂K\8~%∀L_xR¬∀ZJU∀pQ!∃∀-λX∃"βV↔αg]:E3∪αEJC∂pQ!∃≥"6&αbeF!⊂HK::∧≤QQ M∀ZλT
"ε%G]≥E6#αbJF↔ph!~5"[&¬Be#q⊃⊂KZ1Q M∀ZλT
"πV∪αg::B[∪¬EE#∂aQ M≥E6#αbJF∪H⊃↔2ph!~5"[&¬Be#⊃Q M∀ZλT
"πV∪αg::B[∪¬EE#Oa⊃∪\$_y∃%_Q!∃∀-λX∃"βuO5≥"6&αbeF∨`hP~(U∧,~Dβk∪eO5≥"6&αbeF⊗πpH↔84
∧~H∀b∧HZE$-*1PPM(Z∧,
Dεbg]:E3∪αEJC∂pQ!∃∀-λX∃"βV&bg]:E3∪αEJCπa⊃∪]≤X→Db∧HZE$-*1PPM(Z∧,
DεRg]:E3∪αEJC∂pQ!PSZ
8T≤|hH∃∃J
H∀∀dZ4∧4⎇$
4≤ihU⊂h'4¬≥$~HU~∧~(SPh'1∪M88∀tt→hr∧4~*5"∧I→d*¬HZ5$Lht∧4⎇$λ4⎇∃(X5"¬λ_t(h'1∪λM88∀tt→hr∧4z$∧4⎇)T∧4,XAPSX⊗!∃≤≤→idLttλd⎇∩	_EZc03`ENTIFIER OR NUMBER
;	3	SCANNING IDENTIFIER
;	4	SCANNING NUMBER
;	5	SCANNING FOR BREAK CHARACTERS

;	INVALID CHARACTERS

T1:	FAILTS		;0-FAIL TEST
	GET		;1-IGNORE
	REPEAT 4,{BADCHR} ;2-5 ILLEGAL

;	TAB AND SPACE

T2:	BRK		;0-BREAK
	GET		;1-IGNORE
	GET		;2-IGNORE
	STBRK		;3-START BREAK
	STBRK		;4-START BREAK
	GET		;5-IGNORE

;	NULL CHAR - DISK EOF IN ALL STATES

T6:	REPEAT 3,{ZCHAR};0-2 TERMINATE THIS FILE
	REPEAT 3,{BRKSAV};3-5 BREAK,SAVE AND RETURN TO FINISH THIS ID
; MORE SECONDARY TABLES
;	LINE FEED

T3:	GOODTS		;0-END OF TEST
	GET		;1-IGNORE
	GET		;2-IGNORE
	STBRK		;3-START BREAK
	STBRK		;4-START BREAK
	GET		;5-IGNORE

;	FORM FEED

T4:	FAIL2		;0-FAIL TEST
	POPLAB		;1-FF FOUND
	GET		;2-IGNORE
	STBRK		;3-START BREAK
	STBRK		;4-START BREAK
	GET		;5-IGNORE

;	CARRIAGE RETURN

T5:	BRKA		;0-BREAK
	REPEAT 5,{GET}	;1-5 IGNORE

;	#

T7:	BRK		;0-BREAK
	GET		;1-IGNORE
	BADCHR		;2-ILLEGAL
	BADCHR		;3-ILLEGAL
	BRKRET		;4-BREAK AND RETURN
	BADCHR		;5-ILLEGAL

;	DIGITS

T9:	BRK		;0-BREAK
	GET		;1-IGNORE
	STNUM		;2-START PROCESSING NUMBER
	ADDID		;3-ADD TO IDENTIFIER
	ADDNUM		;4-ADD TO NUMBER
	BRKSAV		;5-BREAK, RETURN, AND SAVE

;	PERIOD AND LETTERS

T10:	PROC		;0-PROCESS IDENTIFIER
	GET		;1-IGNORE
	STID		;2-START PROCESSING IDENTIFIER
	ADDID		;3-ADD TO IDENTIFIER
	BADCHR		;4-ILLEGAL
	BRKSAV		;5-BREAK, RETURN, AND SAVE
; FINISH WITH SOME VARIABLES

PDL:	BLOCK PLEN		;PUSH DOWN LIST
DEFOUT:	SIXBIT .GCREF.		;DEFAULT OUTPUT FILE
	SIXBIT .LST.
	0
	0
COMPNT:	POINT 7,COMBUF
COMBUF:	BLOCK =30		;COMMAND BUFFER
SNAM:	BLOCK =5		;SIXBIT NAME
NAME:	BLOCK =5		;ASCIZ NAME (OF DISK FILE)
DEFEXT:	SIXBIT .LST.		;DEFAULT EXTENTION
DEFPPN:	0			;DEFAULT PPN
OBUF:	BLOCK 3
IBUF:	BLOCK 3
BUFRS:	BLOCK NBUF*204		;HERE ARE OUR BUFFERS
CRLF:	ASCIZ .
.
ID:	BLOCK =10		;CURRENT IDENTIFIER
NUMB:	0			;CURRENT NUMBER
LEV1:	BLOCK =10		;TOP LEVEL IDENTIFIER
SHORT:	0			;NON-ZERO IF SHORT LISTING WANTED
LOCAL:	0			;NON-ZERO IF ONLY LOCALS WANTED
GLBAL:	0			;NON-ZERO IF ONLY GLOBALS WANTED
INPNT:	0			;POINTS TO LIST OF INPUT FILES
STRUCT:	0			;POINTS TO START OF DATA STRUCTURE
ERROR:	0			;NON-ZERO FOR COMMAND ERROR
OUTPNT:	0			;POINTS TO OUTPUT FILE NAME
CCNT:	0			;CHARACTER COUNT FOR PAGE TESTING
LFATB:	REPEAT 4,{JRST SETGET}
LFTAB:	GET
	STBRK
	STBRK
	GET

	LIT			; FORCE ALLOCATION OF LITERALS AND VARIABLES
	VAR
FREE:				;HERE IS OUR FREE STORAGE
				; NO CODE BEYOND THIS ADDESS
	END GCREF-2